<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <script>
    // 动手实现一个 repeat方法

    // const repeatFn = repeat(alert, 4, 3000);
    // repeatFn('helloworld');
    // 调用这个 repeatFn('helloworld')会alert 四次 helloworld，每次间隔三秒

    // function repeat(func, time, wait) {
    //   return function (...args) {
    //     return new Promise((resolve, reject) => {
    //       if (time === 0) {
    //         resolve();

    //         return;
    //       }
    //       let i = time;

    //       const funcData = function () {
    //         try {
    //           func.apply(null, args); // 这里this给null 原因一alert本来就是指向window， 第二这里没有用到this
    //           i--;
    //           if (i < 1) {
    //             interVal && clearInterval(interVal);
    //             resolve();
    //           }
    //         } catch (err) {
    //           reject(err);
    //         }
    //       };
    //       funcData();
    //       let interVal = setInterval(() => {
    //         funcData();
    //       }, wait);
    //     });
    //   };
    // }

    function repeat(func, time, wait) {
      return function (...args) {
        return new Promise((resolve, reject) => {
          if (time <= 0) {
            resolve;
            return;
          }

          let i = time;

          const funcData = function () {
            try {
              func.apply(null, args);
              i--;
              if (i < 1) {
                interval && clearInterval(interval);
                resolve();
              }
            } catch (Err) {
              interval && clearInterval(interval);
              reject(Err);
            }
          };
          funcData();
          var interval = setInterval(() => {
            funcData();
          }, wait);
        });
      };
    }
    const repeatFn = repeat(alert, 4, 3000);
    repeatFn('helloworld');

    function add(x) {
      let sum = x;

      const curriedAdd = function (y) {
        sum += y;
        return curriedAdd;
      };

      curriedAdd.valueOf = function () {
        return sum;
      };
      curriedAdd.value = function () {
        return sum;
      };

      curriedAdd.toString = function () {
        return sum.toString();
      };

      Object.freeze(curriedAdd);
      return curriedAdd;
    }

    console.log(add(1)(2)(3).value());
  </script>
  <body></body>
</html>
